debug_state = v->domain->debugger_attached;
if ( unlikely(v->arch.hvm_vcpu.debug_state_latch != debug_state) )
{
- unsigned long intercepts = __vmread(EXCEPTION_BITMAP);
- unsigned long mask = 1u << TRAP_int3;
-
- if ( !cpu_has_monitor_trap_flag )
- mask |= 1u << TRAP_debug;
-
v->arch.hvm_vcpu.debug_state_latch = debug_state;
- if ( debug_state )
- intercepts |= mask;
- else
- intercepts &= ~mask;
- __vmwrite(EXCEPTION_BITMAP, intercepts);
+ vmx_update_debug_state(v);
}
hvm_do_resume(v);
vmx_vmcs_exit(v);
}
+void vmx_update_debug_state(struct vcpu *v)
+{
+ unsigned long intercepts, mask;
+
+ ASSERT(v == current);
+
+ mask = 1u << TRAP_int3;
+ if ( !cpu_has_monitor_trap_flag )
+ mask |= 1u << TRAP_debug;
+
+ intercepts = __vmread(EXCEPTION_BITMAP);
+ if ( v->arch.hvm_vcpu.debug_state_latch )
+ intercepts |= mask;
+ else
+ intercepts &= ~mask;
+ __vmwrite(EXCEPTION_BITMAP, intercepts);
+}
+
static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
{
vmx_vmcs_enter(v);
| (paging_mode_hap(v->domain) ?
0 : (1U << TRAP_page_fault))
| (1U << TRAP_no_device));
+ vmx_update_debug_state(v);
}
}
void vmx_do_resume(struct vcpu *);
void vmx_vlapic_msr_changed(struct vcpu *v);
void vmx_realmode(struct cpu_user_regs *regs);
+void vmx_update_debug_state(struct vcpu *v);
/*
* Exit Reasons